import os
from chardet.universaldetector import UniversalDetector


def get_file_path(project_name, module_name, file_name):
    logging.info("Try get file path of {} from project:{} and module{}".format(file_name, project_name, module_name))
    project_id = ProjectInfo.objects.get_pro_name(project_name, False)
    module_id = ModuleInfo.objects.get(belong_project=project_id, module_name=module_name)
    file_obj = FileInfo.objects.filter(project=project_id, module=module_id, name=file_name)
    if file_obj:
        if len(file_obj) > 1:
            logging.debug("More than one file :project:{} - module{} - file{}".format(project_name, module_name, file_name))
        return file_obj[0].file_path
    else:
        logging.debug("Can't find {} in project:{} and module{}".format(file_name, project_name, module_name))
        return ""

def delete_folder_recursively(dir):
    """
    级联删除路径下的所有文件和文件夹
    :param dir: 需要获取编码方式的文件路径（绝对路径）
    """
    try:
        for pf in os.listdir(dir):
            if os.path.isfile(os.path.join(dir, pf)):
                os.chmod(os.path.join(dir, pf), stat.S_IWRITE)
                os.remove(os.path.join(dir, pf))
            else:
                delete_folder_recursively(os.path.join(dir, pf))
        os.rmdir(dir)
    except:
        traceback.print_exc()


def get_encode_type(file_path):
    """
    通过读取文件内容判断获取文件的编码方式
    :param file_path: 需要获取编码方式的文件路径（绝对路径）
    :return: 文件编码方式
    """
    bigdata = open(file_path,'rb')
    detector = UniversalDetector()
    for line in bigdata.readlines():
        detector.feed(line)
        if detector.done:
            break
    detector.close()
    bigdata.close()
    return _get_unified_encode_type(detector.result['encoding'])

def _get_unified_encode_type(sType):
    """
    统一化文件的编码方式
    :param sType: 通过UniversalDetector获取的文件编码方式
    :return: utf-8或者gbk
    """
    sType = sType.lower()
    if sType in ['utf-8-sig', 'utf-8'] or 'utf' in sType:
        return 'utf-8'
    elif sType in ['gb2312'] or 'gb' in sType:
        return 'gbk'
    else:
        return sType

def change_file_encoding(file_path):
    """
    强制修改文件的编码格式，先通过文件获取文件的编码方式，然后通过该方式读取文件内容，最后以utf-8的格式强行写入文件。
    :param file_path: 需要转换格式的文件路径。
    :return: 无返回值（如果文件没有中文，则显示文件编码方式未ascii,有中文，则编码方式为utf8）
    """
    _, ext = os.path.splitext(file_path)
    if ext not in ['.txt', '.sql']:
        return

    file_encoding = get_encode_type(file_path)

    if file_encoding in ['utf-8', 'ascii']:  # 如果是utf-8或者ascii（不可能有中文）的，则不用转换
        return
    tmp = "tmp%s.txt" %(str(time.time()))
    with open(tmp, 'w', encoding='utf8') as fw:
        with open(file_path, 'r', encoding=file_encoding) as fr:
            for line in fr.readlines():
                fw.write(line)
    os.remove(file_path)
    os.rename(tmp, file_path)

